/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package isd.inventario.web;

import isd.empresa.rn.EM_EmpresaRN;
import isd.general.excepciones.ExcepcionGeneralSistema;
import isd.general.util.JsfUtil;
import isd.general.util.ReportFactory;
import isd.inventario.modelo.ST_Comprobante;
import isd.inventario.modelo.ST_ItemMovimiento;
import isd.inventario.modelo.ST_Movimiento;
import isd.inventario.modelo.ST_Producto;
import isd.inventario.modelo.ST_TipoMovimiento;
import isd.inventario.rn.ComprobanteInventarioRN;
import isd.inventario.rn.InventarioRN;
import isd.inventario.rn.SectorRN;
import isd.seguridad.web.UsuarioSession;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.bean.ManagedProperty;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;

/**
 *
 * @author Claudio
 */
//@ManagedBean(name="movimientoInventarioBean")
//@ViewScoped
public class MovimientoInventarioBean implements Serializable {

    @EJB protected InventarioRN inventarioRN;
    @EJB protected SectorRN sectorRN;
    @EJB protected ComprobanteInventarioRN comprobanteRN;
    @EJB private EM_EmpresaRN empresaRN;

    @ManagedProperty(value = "#{usuarioSession}")
    protected UsuarioSession usuarioSession;

    @ManagedProperty(value = "#{buscadorProductoBean}")
    protected BuscadorProductoBean buscadorProductoBean;


    protected String titulo;
    protected String modcom;
    protected String codcom;

    protected ST_Movimiento m;

    protected Date fechaMinima;


    /** Creates a new instance of MovimientoInventarioBean */
    public MovimientoInventarioBean() {
        
        fechaMinima = new Date();
    }

    public void guardar(boolean nuevo){
        
        try {
            
            inventarioRN.guardar(m);

            JsfUtil.addInfoMessage("El documento " + m.getComprobante().getDescrp() + "-" + m.getNrofor() + " se guardó correctamente", "");

            if (nuevo) {

                //Generamos un nuevo movimiento
                ST_Comprobante comprobante = comprobanteRN.getComprobante(modcom, codcom);
                m = inventarioRN.nuevoMovimiento(comprobante);
            }
        } catch (Exception ex) {

            m.getItemProducto().add(inventarioRN.nuevoItemProducto(m));
            JsfUtil.addErrorMessage(ex.getMessage());
        }

    }

    public void agregarItem(ST_ItemMovimiento nItem){
        try {
            if(!puedoAgregarItem(nItem)) return;

            BigDecimal cantidad = nItem.getCantid();
            ST_Producto prd = buscadorProductoBean.getProducto();

            nItem.setProducto(prd);
            nItem.setProductoPRD(prd);
            nItem.setCantid(cantidad);
            
            //Cargarmos un nuevo item en blanco
            m.getItemProducto().add(inventarioRN.nuevoItemProducto(m));            
            //Limpiamos el buscador de productos
            buscadorProductoBean.setProducto(null);

        } catch (Exception ex) {
            ex.printStackTrace();
            JsfUtil.addErrorMessage(ex.getMessage());
        }
    }

    public boolean puedoAgregarItem(ST_ItemMovimiento nItem){       
        
        //Si es ingreso o transferencia validamos que la cantidad sea mayor a cero
        if(m.getTipoMovimiento().equals(ST_TipoMovimiento.I) || m.getTipoMovimiento().equals(ST_TipoMovimiento.T)){

            if(nItem.getCantid()==null || nItem.getCantid().compareTo(BigDecimal.ZERO)<=0){
                JsfUtil.addErrorMessage("Ingrese un valor de cantidad mayor a 0");
                return false;
            }            
        }
        
        //Si es egreso validamos que la cantidad sea menor a cero
        if(m.getTipoMovimiento().equals(ST_TipoMovimiento.E)){

            if(nItem.getCantid()==null || nItem.getCantid().compareTo(BigDecimal.ZERO)>=0){
                JsfUtil.addErrorMessage("Ingrese un valor de cantidad menor a 0");
                return false;
            }            
        }
        
        //Si es ajuste solamente validamos que sea distinto de cero
        if(m.getTipoMovimiento().equals(ST_TipoMovimiento.E)){

            if(nItem.getCantid()==null || nItem.getCantid().compareTo(BigDecimal.ZERO)!=0){
                JsfUtil.addErrorMessage("Ingrese un valor de cantidad distinto a 0");
                return false;
            }            
        }
        
        if(buscadorProductoBean.getProducto()==null){
            JsfUtil.addErrorMessage("Seleccione un producto para agregar al comprobante");
            return false;
        }

        //Si el producto controla stock por numero de serie solicita obligatoriamente
        if(buscadorProductoBean.getProducto().getDefineSerie().equals("S")){
            if(nItem.getNserie().isEmpty()){
                JsfUtil.addErrorMessage("Ingrese serie para el producto a agregar");
                return false;
            }
        }else{
            if(!nItem.getNserie().isEmpty()){
//                JsfUtil.addInfoMessage("El producto no controla serie, no es necesario ingresarla");
            }
//            nItem.setNserie("");
        }
        
        return true;
    }

    public void eliminarItemProducto(ST_ItemMovimiento nItem){

        if(inventarioRN.eliminarItemProducto(m, nItem)){
            JsfUtil.addWarningMessage("Se ha borrado el item "+ nItem.getProducto().getDescrp() + "");
        }else{
            JsfUtil.addWarningMessage("No se ha borrado el item "+ nItem.getProducto().getDescrp() + "");
        }
    }

    public void limipiarSector(String tipoDeposito){

        //Por ahora dejamos siempre los sectores cero por defecto
        try {
            if (tipoDeposito.equals("I") && m.getDepositoIngreso() != null) {

                m.setSectorIngreso(sectorRN.getSector(m.getDepositoIngreso().getDeposi(), "0"));
            }

            if (tipoDeposito.equals("E") && m.getDepositoEgreso() != null) {

                m.setSectorEgreso(sectorRN.getSector(m.getDepositoEgreso().getDeposi(), "0"));
            }
        } catch (Exception e) {

            JsfUtil.addErrorMessage("No es posible limpiar el sector del deposito");
        }
    }

    public void imprimir(){

        try {
            System.out.println("Nombre reporte" + m.getFormulario().getNombreReporte());

            if (m.getFormulario().getNombreReporte() ==null){
                throw new ExcepcionGeneralSistema("El comprobante no tienen reporte asociado");
            }

            JasperReport masterReport = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResourceAsStream(m.getFormulario().getNombreReporte()+".jasper"));

            Map parameters = new HashMap();
            parameters.put("MODFOR", m.getModfor());
            parameters.put("CODFOR", m.getCodfor());
            parameters.put("NROFOR", m.getNrofor());

            empresaRN.cargarDatosEmpresa(parameters);

            String nombreArchivo = m.getComprobante().getCodigo()+"-"+m.getNrofor();

            System.out.println("Imprimir a pdf: " + nombreArchivo);

            ReportFactory rf = new ReportFactory();
            rf.verReportePDF(masterReport, nombreArchivo, parameters);

        } catch (Exception e){
            e.printStackTrace();
            JsfUtil.addErrorMessage("No se puede imprimir a pdf " + e.getMessage());
        }
    }

    public BuscadorProductoBean getBuscadorProductoBean() {
        return buscadorProductoBean;
    }

    public void setBuscadorProductoBean(BuscadorProductoBean buscadorProductoBean) {
        this.buscadorProductoBean = buscadorProductoBean;
    }

    public UsuarioSession getUsuarioSession() {
        return usuarioSession;
    }

    public void setUsuarioSession(UsuarioSession usuarioSession) {
        this.usuarioSession = usuarioSession;
    }

    public String getCodcom() {
        return codcom;
    }

    public void setCodcom(String codcom) {
        this.codcom = codcom;
    }

    public ST_Movimiento getM() {
        return m;
    }

    public void setM(ST_Movimiento m) {
        this.m = m;
    }

    public String getModcom() {
        return modcom;
    }

    public void setModcom(String modcom) {
        this.modcom = modcom;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public Date getFechaMinima() {
        return fechaMinima;
    }

    public void setFechaMinima(Date fechaMinima) {
        this.fechaMinima = fechaMinima;
    }

    

}
